import handleUser from './index'
import { isValidKey } from '@/utils/isValidKey'

const reducer = (state = { ...handleUser.state }, action: { type: string; val: string & object }) => {
  const newState = JSON.parse(JSON.stringify(state))

  // 思路： switch的做法是拿着action.type和case后面的每一个进行对比，这种做法很像遍历。
  // 那我们就把case后面的这些值做成对象，actionNames
  // switch(action.type){
  //   case "add1":
  //   case handleNum.add1:
  //     handleNum.actions[handleNum.add1](newState,action)
  //     break;
  //   case handleNum.add2:
  //     handleNum.actions[handleNum.add2](newState,action)
  //     break;
  //   default:
  //     break;
  // }
  // 【优化】上面这样写，我们没添加一个方法，都要在这里多写一句case
  // 拿着action.type和actionNames进行每一项的对比，如果是相等，就调用 模块名.actions[下标](newState,action)
  for (const key in handleUser.actionNames) {
    // key是每一个键
    // 判断是不是相等
    if (isValidKey(key, handleUser.actionNames)) {
      if (action.type === handleUser.actionNames[key]) {
        handleUser.actions[handleUser.actionNames[key] as keyof typeof handleUser.actions](newState, action)
        break
      }
    }
  }
  // 这样写就达到每一次写一个方法都不需要再手动来添加这几case，终于可以解放双手了！
  return newState
}

export default reducer
